/*This file is part of Sandbox.

Sandbox is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License.

Sandbox is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Sandbox.  If not, see <http://www.gnu.org/licenses/>.

For contact, see the About page of my blog: <http://mygeekyware.wordpress.com/>.*/

#include <iostream>
#include "controlador.h"
#include "definiciones.h"
#include <SDL/SDL.h>
#include <SDL/SDL_events.h>
#include "particula.h"
#include <math.h>

using namespace std;

void controlador::Salt2Water(particula matriz[400][220], int x, int y, int x2, int y2) {
    matriz[x][y].tipo = 0;
    matriz[x][y].empuje = 0;
    matriz[x][y].contador = 0;
    matriz[x][y].peso = 0;
    matriz[x2][y2].tipo = SALTWATER;
    matriz[x2][y2].peso = 2;
    matriz[x2][y2].contador = 0;
}

void controlador::MakePlant(particula matriz[400][220], int x, int y) {
    Clear(matriz,x,y);
    matriz[x][y].tipo = PLANT;
    matriz[x][y].contador = 10;
    matriz[x][y].peso = 20;
}

void controlador::Plant2Fire(particula matriz[400][220], int x, int y) {
    matriz[x][y].tipo = FIRE;
    matriz[x][y].peso = 0;
    matriz[x][y].contador = 15;
}

void controlador::Water2Steam(particula matriz[400][220], int x, int y) {
    matriz[x][y].tipo = STEAM;
    matriz[x][y].peso = 0;
}

void controlador::Steam2Water(particula matriz[400][220], int x, int y) {
    matriz[x][y].tipo = WATER;
    matriz[x][y].peso = 1;
}

void controlador::Saltwater2Steam(particula matriz[400][220], int x, int y) {
    matriz[x][y].tipo = SALT;
    matriz[x][y].peso = 3;
    matriz[x][y].vx = 0;
    matriz[x][y].vy = 0;
    matriz[x][y].empuje = 0;
    if (matriz[x][y-1].tipo == 0) {
        matriz[x][y-1].tipo = STEAM;
        matriz[x][y-1].peso = 0;
    }
    else if (matriz[x-1][y-1].tipo == 0) {
        matriz[x-1][y-1].tipo = STEAM;
        matriz[x-1][y-1].peso = 0;
    }
    else if (matriz[x+1][y-1].tipo == 0) {
        matriz[x+1][y-1].tipo = STEAM;
        matriz[x+1][y-1].peso = 0;
    }
    else if (matriz[x-1][y].tipo == 0) {
        matriz[x-1][y].tipo = STEAM;
        matriz[x-1][y].peso = 0;
    }
    else if (matriz[x+1][y].tipo == 0) {
        matriz[x+1][y].tipo = STEAM;
        matriz[x+1][y].peso = 0;
    }
}

void controlador::Water2Ice(particula matriz[400][220], int x, int y) {
    matriz[x][y].tipo = ICE;
    matriz[x][y].peso = 20;
}

void controlador::WaterMagma2Stone(particula matriz[400][220], int x, int y, int x2, int y2) {
    Clear(matriz,x,y);
    Clear(matriz,x2,y2);
    matriz[x][y].tipo = STONE;
    matriz[x][y].peso = 3;
}

void controlador::ExplodeBomb(particula matriz[400][220], int x, int y) {
    //Lo convertimos en fuego lo primero:
    Clear(matriz,x,y);
    matriz[x][y].tipo = FIRE;
    matriz[x][y].contador = 30;
    int radio = 20; //Radio de acción de la explosión, para recorrer esa zona
    int dx,dy;
    for (dx = -radio;dx <= radio;dx++) {
        for (dy = -sqrt(radio*radio-dx*dx); dy <= sqrt(radio*radio-dx*dx); dy++) {
            if (dx == 0 && dy == 0)
                continue;
            if (matriz[x+dx][y+dy].tipo != 0) {
                float sina = (float)dy/sqrt(dx*dx+dy*dy);
                matriz[x+dx][y+dy].vy = (int)15*sina;
                matriz[x+dx][y+dy].vx = sqrt(15*15*(1-sina*sina));
                if (dx<0) matriz[x+dx][y+dy].vx *= -1;
                if (dx > 0)
                    matriz[x+dx][y+dy].update = false;
                if (dy > 0 && dx >= 0)
                    matriz[x+dx][y+dy].update = false;
            }
        }
    }

    for (dx = -1;dx <= 1;dx++) {
        for (dy = -1;dy<=1;dy++) {
            if (matriz[x+dx][y+dy].tipo == BOMB) {
                ExplodeBomb(matriz,x+dx,y+dy);
            }
        }
    }
}